import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')  # 出图设置
plt.rcParams['font.sans-serif'] = 'SimSun'#宋体设置
plt.rcParams['axes.unicode_minus'] = False   # 字符显示


# # hist直方图
# # 可以选择风格
# plt.style.use('seaborn-white')
# data = np.random.randn(1000)
# plt.hist(data, density=True, alpha=0.5,color='green',);
# #  注意 :  density=True 为统计频率   density=False  是统计频数(数量)
# # 频率 = 区间数目 / (总数 * 区间宽度 )
# #  alpha=0.5  代表透明度
# # 分组
# plt.hist(data, bins=30, density=True, alpha=0.5,color='steelblue');#bins组距
# plt.show()


"""
print(plt.style.available) # 打印美化样式列表
['bmh', 'classic', 'dark_background', 'fast', 
'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 
'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid',
 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 
'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks',
 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 
'tableau-colorblind10', '_classic_test']
"""



#
# # 1）准备数据代表电影的数量 根据数据绘制直方图
# time = [131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
#
# # 2）创建画布
# plt.figure(figsize=(10, 5), dpi=100)
#
# # 3）绘制直方图
#
# # 设置组距
# #重要
# #设置组距 bins：指直方图条形宽度
# #设置组数（通常对于数据较少的情况，分为5~12组，数据较多，更换图形显示方式）
# #通常设置组数会有相应公式：组数 = 极差/组距= (max-min)/distance
#
# # 组距
# distance = 2
# # 计算组数(试试不用组数)
# group_num = int((max(time) - min(time)) / distance)
# # 绘制直方图
# plt.hist(time, bins=group_num)
#
# # 修改x轴刻度显示
# plt.xticks(range(min(time), max(time))[::2] ,fontsize=8)
#
# # 添加网格显示
# plt.grid(linestyle="--", alpha=0.5)
#
# # 添加x, y轴描述信息
# plt.xlabel("电影时长大小")
# plt.ylabel("电影的数据量")
#
# # 4）显示图像
# plt.show()



# 案例一
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel(r'./grade1.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['得分']
plt.xlabel('分数')
plt.ylabel('学生数量')
# 显示图标题
plt.title("高一数学成绩分布直方图")
plt.hist(x, bins = [0,25,50,75,100,125,150],facecolor="blue", alpha=0.7)
plt.show()
# bins = [0,25,50,75,100,125,150] 0 到满分150  进行分组 这是逻辑 ,即能看到组数和组距


# 案例二
# import numpy as np
# import pandas as pd
# import matplotlib.pyplot as plt
#
# # 中文和负号的正常显示
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# plt.rcParams['axes.unicode_minus'] = False
#
# # 读取Titanic数据集
# titanic = pd.read_csv('./train.csv')
# # 检查年龄是否有缺失any(titanic.Age.isnull())
# # 不妨删除含有缺失年龄的观察
# titanic.dropna(subset=['Age'], inplace=True)
#
# # 设置图形的显示风格
# plt.style.use('ggplot')
# # 绘图：乘客年龄的频数直方图
# plt.hist(
#     titanic.Age,  # 绘图数据
#     bins=
#     20,  # 指定直方图的条形数为20个   # (titanic.Age.max() - titanic.Age.min()) / 4   4 为组距自己设置
#     color='steelblue',  # 指定填充色
#     label='直方图')  # 为直方图呈现标签
#
# # 显示图例
# plt.legend()
# # 显示图形
# plt.show()
#
#
# # 绘图：乘客年龄的累计频率直方图
# plt.hist(titanic.Age, # 绘图数据
#         bins = np.arange(titanic.Age.min(),titanic.Age.max() + 10,8), # 指定直方图的组距
#         density = True, # 设置为频率直方图
#         cumulative = True, # 积累直方图   #  这是真谛  ***********
#         color = 'steelblue', # 指定填充色
#         edgecolor = 'k', # 指定直方图的边界色显得更好看
#         label = '直方图' )# 为直方图呈现标签
#
# # 设置坐标轴标签和标题
# plt.title('乘客年龄的频率累计直方图')
# plt.xlabel('年龄')
# plt.ylabel('累计频率')
#
# # 去除图形顶部边界和右边界的刻度
# plt.tick_params(colors='red',axis= 'x')
#
# # 显示图例
# plt.legend(loc = 'best')
# # 显示图形
# plt.show()
#
# #   可以看的到 .30岁以下的年龄的人数 基本在60 %   40 岁以下的基本达到80%
#
#
# # 提取不同性别的年龄数据
# age_female = titanic[titanic.Sex == 'female']['Age']
# age_male =titanic[titanic.Sex == 'male']['Age']
#
# # 设置直方图的组距,注意和range的区别
# bins = np.arange(
#     titanic.Age.min(),
#     titanic.Age.max() + 4,
#     2)  #   0.42岁  和  80岁  去进行每两个为1组   因为左闭右开  所以titanic.Age.max()+2 可以取到最大值
# # 男性乘客年龄直方图
# plt.hist(age_male, bins=bins, label='男性', color='steelblue', alpha=0.7)
# # 女性乘客年龄直方图
# plt.hist(age_female, bins=bins, label='女性', alpha=0.6)
#
# # 设置坐标轴标签和标题
# plt.title('乘客年龄直方图')
# plt.xlabel('年龄')
# plt.ylabel('人数')
#
# # 显示图例
# plt.legend()
# # 显示图形
# plt.show()